Report generated on 28-Jan-2026 at 18:22:03 by pytest-html v3.1.1
15 tests ran in 905.14 seconds.
(Un)check the boxes to filter the results.
6 passed, 0 skipped, 9 failed, 3 errors, 0 expected failures, 0 unexpected passes, 0 rerun| Result | Test | Duration | Links |
|---|---|---|---|
| No results found. Try to check the filters | |||
| Error | tests/frontend/test_users.py::test_user_menu_click_user_menu_links_tc_id_c95102[Desktop]::setup | 74.53 | Driver Log URL HTML |
|
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="64c51498-08b5-4583-b0ef-75f324ec7711")>, base_url = 'https://addons.allizom.org', session_auth = None request = <SubRequest 'selenium' for <Function test_user_menu_click_user_menu_links_tc_id_c95102[Desktop]>> @pytest.fixture( scope="function", params=[DESKTOP], ids=["Desktop"], ) def selenium(selenium, base_url, session_auth, request): """Fixture to set a custom resolution for tests running on Desktop and handle browser sessions when needed""" selenium.set_window_size(*request.param) # establishing actions based on markers create_session = request.node.get_closest_marker("create_session") login = request.node.get_closest_marker("login") clear_session = request.node.get_closest_marker("clear_session") # this is used when we want to open an AMO page with a sessionid # cookie (i.e. a logged-in user) already set if create_session: # need to set the url context if we want to apply a cookie # in order to avoid InvalidCookieDomainException error selenium.get(base_url) # set the sessionid cookie selenium.add_cookie( { "name": "sessionid", "value": session_auth, } ) # this is used when we want to start the browser with a normal login # mostly used for the scope of getting the session cookie and storing it for later use if login: home = Home(selenium, base_url).open().wait_for_page_to_load() home.header.click_login() home.wait.until( EC.visibility_of_element_located((By.NAME, "email")), message=f"FxA email input field was not displayed in {selenium.current_url}", ) user = login.args[0] > Login(selenium, base_url).account(user) tests/conftest.py:146: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/login.py:92: in account self.fxa_login( pages/desktop/frontend/login.py:205: in fxa_login self.wait.until(EC.url_contains("signin_totp_code")) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="64c51498-08b5-4583-b0ef-75f324ec7711")>, method = <function url_contains.<locals>._predicate at 0x105a284a0>, message = '' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException -----------------------------Captured stdout setup------------------------------ The "click continue button" event occurred. | |||
| Error | tests/frontend/test_users.py::test_user_edit_profile_tc_id_c4607[Desktop]::setup | 75.30 | Driver Log URL HTML |
|
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="8689dc5c-d805-434e-ac90-857168cd7606")>, base_url = 'https://addons.allizom.org', session_auth = None request = <SubRequest 'selenium' for <Function test_user_edit_profile_tc_id_c4607[Desktop]>> @pytest.fixture( scope="function", params=[DESKTOP], ids=["Desktop"], ) def selenium(selenium, base_url, session_auth, request): """Fixture to set a custom resolution for tests running on Desktop and handle browser sessions when needed""" selenium.set_window_size(*request.param) # establishing actions based on markers create_session = request.node.get_closest_marker("create_session") login = request.node.get_closest_marker("login") clear_session = request.node.get_closest_marker("clear_session") # this is used when we want to open an AMO page with a sessionid # cookie (i.e. a logged-in user) already set if create_session: # need to set the url context if we want to apply a cookie # in order to avoid InvalidCookieDomainException error selenium.get(base_url) # set the sessionid cookie selenium.add_cookie( { "name": "sessionid", "value": session_auth, } ) # this is used when we want to start the browser with a normal login # mostly used for the scope of getting the session cookie and storing it for later use if login: home = Home(selenium, base_url).open().wait_for_page_to_load() home.header.click_login() home.wait.until( EC.visibility_of_element_located((By.NAME, "email")), message=f"FxA email input field was not displayed in {selenium.current_url}", ) user = login.args[0] > Login(selenium, base_url).account(user) tests/conftest.py:146: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/login.py:87: in account self.fxa_login(self.REUSABLE_USER_EMAIL, self.REUSABLE_USER_PASSWORD, "") pages/desktop/frontend/login.py:223: in fxa_login self.wait.until( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="8689dc5c-d805-434e-ac90-857168cd7606")>, method = <function url_contains.<locals>._predicate at 0x105873ec0> message = 'AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopeni...28282f7ea3fa672695faa90ac7949c5578ba7aa41f20e%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopenid&state=70ea0c420dc84f5eed528282f7ea3fa672695faa90ac7949c5578ba7aa41f20e%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException -----------------------------Captured stdout setup------------------------------ The "click continue button" event occurred. | |||
| Error | tests/frontend/test_users.py::test_user_account_manage_section[Desktop]::setup | 76.11 | Driver Log URL HTML |
|
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="acd4739b-1712-46b1-acba-0a651a093a66")>, base_url = 'https://addons.allizom.org', session_auth = None request = <SubRequest 'selenium' for <Function test_user_account_manage_section[Desktop]>> @pytest.fixture( scope="function", params=[DESKTOP], ids=["Desktop"], ) def selenium(selenium, base_url, session_auth, request): """Fixture to set a custom resolution for tests running on Desktop and handle browser sessions when needed""" selenium.set_window_size(*request.param) # establishing actions based on markers create_session = request.node.get_closest_marker("create_session") login = request.node.get_closest_marker("login") clear_session = request.node.get_closest_marker("clear_session") # this is used when we want to open an AMO page with a sessionid # cookie (i.e. a logged-in user) already set if create_session: # need to set the url context if we want to apply a cookie # in order to avoid InvalidCookieDomainException error selenium.get(base_url) # set the sessionid cookie selenium.add_cookie( { "name": "sessionid", "value": session_auth, } ) # this is used when we want to start the browser with a normal login # mostly used for the scope of getting the session cookie and storing it for later use if login: home = Home(selenium, base_url).open().wait_for_page_to_load() home.header.click_login() home.wait.until( EC.visibility_of_element_located((By.NAME, "email")), message=f"FxA email input field was not displayed in {selenium.current_url}", ) user = login.args[0] > Login(selenium, base_url).account(user) tests/conftest.py:146: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/login.py:87: in account self.fxa_login(self.REUSABLE_USER_EMAIL, self.REUSABLE_USER_PASSWORD, "") pages/desktop/frontend/login.py:223: in fxa_login self.wait.until( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="acd4739b-1712-46b1-acba-0a651a093a66")>, method = <function url_contains.<locals>._predicate at 0x1059d3600> message = 'AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopeni...638c97e745d7b5eba962c46e7e3567f9c68b42845c56f%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopenid&state=7b832d30bb6e7172b3d638c97e745d7b5eba962c46e7e3567f9c68b42845c56f%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException -----------------------------Captured stdout setup------------------------------ The "click continue button" event occurred. | |||
| Failed | tests/frontend/test_users.py::test_user_menu_edit_profile_tc_id_c95102[Desktop] | 74.64 | Driver Log URL HTML |
|
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="9ad193f5-6823-466c-98a4-ff0d5a36c1f5")> @pytest.mark.sanity @pytest.mark.serial @pytest.mark.nondestructive def test_user_menu_edit_profile_tc_id_c95102(base_url, selenium): """Ensures that the "Edit Profile" option in the user menu works and redirects to the correct page.""" page = Home(selenium, base_url).open().wait_for_page_to_load() > page.login("regular_user") tests/frontend/test_users.py:76: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/base.py:91: in login fxa.account(user) pages/desktop/frontend/login.py:166: in account self.fxa_login(self.REGULAR_USER_EMAIL, self.REGULAR_USER_PASSWORD, "") pages/desktop/frontend/login.py:223: in fxa_login self.wait.until( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="9ad193f5-6823-466c-98a4-ff0d5a36c1f5")>, method = <function url_contains.<locals>._predicate at 0x105926700> message = 'AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopeni...1793eed2856df173200f7d64ba768b5bab2c707ec64d0%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopenid&state=8534b21d25aefb645921793eed2856df173200f7d64ba768b5bab2c707ec64d0%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException ------------------------------Captured stdout call------------------------------ The "click continue button" event occurred. | |||
| Failed | tests/frontend/test_users.py::test_user_developer_notifications[Desktop] | 43.73 | Driver Log URL HTML |
|
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="4f05eb89-2360-4fab-8b55-72d430e67bd3")> variables = {'4mb_addon_slug': '4mb_addon_slug', 'addon_detail_guid': '{446900e4-71c2-419f-a6a7-df9c091e268b}', 'addon_detail_id':...dd-ons must comply with Mozilla’s Add-on Policies and are subject to manual review at any time after submission.', ...} wait = <[AttributeError("'function' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x105a6c0d0> @pytest.mark.serial @pytest.mark.nondestructive @pytest.mark.create_session("developer") def test_user_developer_notifications(base_url, selenium, variables, wait): """Validates the notifications settings for a developer user, ensuring all available options are listed.""" Home(selenium, base_url).open().wait_for_page_to_load() user = User(selenium, base_url).open().wait_for_page_to_load() # verifies that information messages about the scope of notifications are displayed > assert variables["notifications_info_text"] in user.edit.notifications_info_text tests/frontend/test_users.py:130: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/users.py:731: in notifications_info_text self.wait.until( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="4f05eb89-2360-4fab-8b55-72d430e67bd3")>, method = <function visibility_of_element_located.<locals>._predicate at 0x1058716c0>, message = '' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: E Stacktrace: E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8 E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5 E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5 E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException | |||
| Failed | tests/frontend/test_users.py::test_user_mandatory_notifications[Desktop] | 43.25 | Driver Log URL HTML |
|
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="35540115-705d-4091-9696-ee495739b7bd")> @pytest.mark.serial @pytest.mark.nondestructive @pytest.mark.create_session("developer") def test_user_mandatory_notifications(base_url, selenium): """Ensures that mandatory notifications for developers cannot be unchecked.""" Home(selenium, base_url).open().wait_for_page_to_load() user = User(selenium, base_url).open().wait_for_page_to_load() # notifications 5 to 7 are mandatory for developers; clicking the checkboxes should have no effect > for checkbox in user.edit.notifications_checkbox[4:7]: tests/frontend/test_users.py:153: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/users.py:741: in notifications_checkbox message=f"There were {len(self.notification_text)} notifications displayed, expected 8", pages/desktop/frontend/users.py:747: in notification_text self.wait.until( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="35540115-705d-4091-9696-ee495739b7bd")>, method = <function visibility_of_element_located.<locals>._predicate at 0x105a299e0>, message = '' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: E Stacktrace: E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8 E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5 E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5 E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException | |||
| Failed | tests/frontend/test_users.py::test_user_view_profile_tc_id_c452203[Desktop] | 32.65 | Driver Log URL HTML |
|
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="300d0683-3527-44be-a291-f9c33452bdf1")> variables = {'4mb_addon_slug': '4mb_addon_slug', 'addon_detail_guid': '{446900e4-71c2-419f-a6a7-df9c091e268b}', 'addon_detail_id':...dd-ons must comply with Mozilla’s Add-on Policies and are subject to manual review at any time after submission.', ...} @pytest.mark.sanity @pytest.mark.serial @pytest.mark.create_session("reusable_user") def test_user_view_profile_tc_id_c452203(base_url, selenium, variables): """Confirms that the profile view displays the correct information after editing.""" user = User(selenium, base_url).open().wait_for_page_to_load() # opens the View profile page > user.edit.click_view_profile_link() tests/frontend/test_users.py:196: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/users.py:568: in click_view_profile_link ).until(EC.element_to_be_clickable(self._view_profile_link_locator)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="300d0683-3527-44be-a291-f9c33452bdf1")>, method = <function element_to_be_clickable.<locals>._predicate at 0x105924900>, message = '' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: E Stacktrace: E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8 E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5 E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5 E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException | |||
| Failed | tests/frontend/test_users.py::test_user_change_profile_picture[Desktop] | 32.19 | Driver Log URL HTML |
|
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="c3e25b27-b73b-466d-afb5-58ee0285eeef")> wait = <[AttributeError("'function' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x105b24550> @pytest.mark.serial @pytest.mark.create_session("reusable_user") def test_user_change_profile_picture(base_url, selenium, wait): """Tests changing and verifying the user's profile picture.""" user = User(selenium, base_url).open().wait_for_page_to_load() # opens the View profile page > user.edit.click_view_profile_link() tests/frontend/test_users.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/users.py:568: in click_view_profile_link ).until(EC.element_to_be_clickable(self._view_profile_link_locator)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="c3e25b27-b73b-466d-afb5-58ee0285eeef")>, method = <function element_to_be_clickable.<locals>._predicate at 0x105873c40>, message = '' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: E Stacktrace: E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8 E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5 E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5 E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException | |||
| Failed | tests/frontend/test_users.py::test_user_delete_profile_picture[Desktop] | 11.99 | Driver Log URL HTML |
|
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="779919bc-4397-4eed-8f44-7dd279c02152")> @pytest.mark.serial @pytest.mark.create_session("reusable_user") def test_user_delete_profile_picture(base_url, selenium): """Verifies that a user can delete their profile picture and see the default avatar.""" user = User(selenium, base_url).open().wait_for_page_to_load() > user.edit.delete_profile_picture() tests/frontend/test_users.py:245: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/users.py:689: in delete_profile_picture self.find_element(*self._delete_picture_button_locator).click() venv/lib/python3.11/site-packages/pypom/region.py:106: in find_element return self.driver_adapter.find_element(strategy, locator, root=self.root) venv/lib/python3.11/site-packages/pypom/selenium_driver.py:61: in find_element return self.driver.find_element(strategy, locator) venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:856: in find_element return self.execute(Command.FIND_ELEMENT, { venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:429: in execute self.error_handler.check_response(response) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x105cbf9d0> response = {'status': 404, 'value': '{"value":{"error":"no such element","message":"Unable to locate element: .UserProfileEditPic.../content/shared/webdriver/Errors.sys.mjs:555:5\\ndom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16\\n"}}'} def check_response(self, response: Dict[str, Any]) -> None: """ Checks that a JSON response from the WebDriver does not have an error. :Args: - response - The JSON response from the WebDriver server as a dictionary object. :Raises: If the response contains an error message. """ status = response.get('status', None) if not status or status == ErrorCode.SUCCESS: return value = None message = response.get("message", "") screen: str = response.get("screen", "") stacktrace = None if isinstance(status, int): value_json = response.get('value', None) if value_json and isinstance(value_json, str): import json try: value = json.loads(value_json) if len(value.keys()) == 1: value = value['value'] status = value.get('error', None) if not status: status = value.get("status", ErrorCode.UNKNOWN_ERROR) message = value.get("value") or value.get("message") if not isinstance(message, str): value = message message = message.get('message') else: message = value.get('message', None) except ValueError: pass exception_class: Type[WebDriverException] if status in ErrorCode.NO_SUCH_ELEMENT: exception_class = NoSuchElementException elif status in ErrorCode.NO_SUCH_FRAME: exception_class = NoSuchFrameException elif status in ErrorCode.NO_SUCH_SHADOW_ROOT: exception_class = NoSuchShadowRootException elif status in ErrorCode.NO_SUCH_WINDOW: exception_class = NoSuchWindowException elif status in ErrorCode.STALE_ELEMENT_REFERENCE: exception_class = StaleElementReferenceException elif status in ErrorCode.ELEMENT_NOT_VISIBLE: exception_class = ElementNotVisibleException elif status in ErrorCode.INVALID_ELEMENT_STATE: exception_class = InvalidElementStateException elif status in ErrorCode.INVALID_SELECTOR \ or status in ErrorCode.INVALID_XPATH_SELECTOR \ or status in ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPER: exception_class = InvalidSelectorException elif status in ErrorCode.ELEMENT_IS_NOT_SELECTABLE: exception_class = ElementNotSelectableException elif status in ErrorCode.ELEMENT_NOT_INTERACTABLE: exception_class = ElementNotInteractableException elif status in ErrorCode.INVALID_COOKIE_DOMAIN: exception_class = InvalidCookieDomainException elif status in ErrorCode.UNABLE_TO_SET_COOKIE: exception_class = UnableToSetCookieException elif status in ErrorCode.TIMEOUT: exception_class = TimeoutException elif status in ErrorCode.SCRIPT_TIMEOUT: exception_class = TimeoutException elif status in ErrorCode.UNKNOWN_ERROR: exception_class = WebDriverException elif status in ErrorCode.UNEXPECTED_ALERT_OPEN: exception_class = UnexpectedAlertPresentException elif status in ErrorCode.NO_ALERT_OPEN: exception_class = NoAlertPresentException elif status in ErrorCode.IME_NOT_AVAILABLE: exception_class = ImeNotAvailableException elif status in ErrorCode.IME_ENGINE_ACTIVATION_FAILED: exception_class = ImeActivationFailedException elif status in ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS: exception_class = MoveTargetOutOfBoundsException elif status in ErrorCode.JAVASCRIPT_ERROR: exception_class = JavascriptException elif status in ErrorCode.SESSION_NOT_CREATED: exception_class = SessionNotCreatedException elif status in ErrorCode.INVALID_ARGUMENT: exception_class = InvalidArgumentException elif status in ErrorCode.NO_SUCH_COOKIE: exception_class = NoSuchCookieException elif status in ErrorCode.UNABLE_TO_CAPTURE_SCREEN: exception_class = ScreenshotException elif status in ErrorCode.ELEMENT_CLICK_INTERCEPTED: exception_class = ElementClickInterceptedException elif status in ErrorCode.INSECURE_CERTIFICATE: exception_class = InsecureCertificateException elif status in ErrorCode.INVALID_COORDINATES: exception_class = InvalidCoordinatesException elif status in ErrorCode.INVALID_SESSION_ID: exception_class = InvalidSessionIdException elif status in ErrorCode.UNKNOWN_METHOD: exception_class = UnknownMethodException else: exception_class = WebDriverException if not value: value = response['value'] if isinstance(value, str): raise exception_class(value) if message == "" and 'message' in value: message = value['message'] screen = None # type: ignore[assignment] if 'screen' in value: screen = value['screen'] stacktrace = None st_value = value.get('stackTrace') or value.get('stacktrace') if st_value: if isinstance(st_value, str): stacktrace = st_value.split('\n') else: stacktrace = [] try: for frame in st_value: line = frame.get("lineNumber", "") file = frame.get("fileName", "<anonymous>") if line: file = f"{file}:{line}" meth = frame.get('methodName', '<anonymous>') if 'className' in frame: meth = "{}.{}".format(frame['className'], meth) msg = " at %s (%s)" msg = msg % (meth, file) stacktrace.append(msg) except TypeError: pass if exception_class == UnexpectedAlertPresentException: alert_text = None if 'data' in value: alert_text = value['data'].get('text') elif 'alert' in value: alert_text = value['alert'].get('text') raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here > raise exception_class(message, screen, stacktrace) E selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: .UserProfileEditPicture-delete-button button E Stacktrace: E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8 E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5 E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5 E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16 venv/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py:243: NoSuchElementException | |||
| Failed | tests/frontend/test_users.py::test_user_update_profile[Desktop] | 44.46 | Driver Log URL HTML |
|
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="3b46678b-6797-454c-b2e8-6e1d686c39f0")> variables = {'4mb_addon_slug': '4mb_addon_slug', 'addon_detail_guid': '{446900e4-71c2-419f-a6a7-df9c091e268b}', 'addon_detail_id':...dd-ons must comply with Mozilla’s Add-on Policies and are subject to manual review at any time after submission.', ...} @pytest.mark.serial @pytest.mark.create_session("reusable_user") def test_user_update_profile(base_url, selenium, variables): """Ensures that a user can update their profile fields, including display name, biography, and location.""" user = User(selenium, base_url).open().wait_for_page_to_load() updated_name = "new_display_name" # update field > user.edit.display_name_field.clear() tests/frontend/test_users.py:266: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/users.py:616: in display_name_field self.wait.until( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="3b46678b-6797-454c-b2e8-6e1d686c39f0")>, method = <function visibility_of_element_located.<locals>._predicate at 0x105925c60>, message = '' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: E Stacktrace: E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8 E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5 E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5 E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException | |||
| Failed | tests/frontend/test_users.py::test_user_update_url[Desktop] | 42.25 | Driver Log URL HTML |
|
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="6757fc4e-6189-42b5-b3ab-3890dc7c1013")> variables = {'4mb_addon_slug': '4mb_addon_slug', 'addon_detail_guid': '{446900e4-71c2-419f-a6a7-df9c091e268b}', 'addon_detail_id':...dd-ons must comply with Mozilla’s Add-on Policies and are subject to manual review at any time after submission.', ...} @pytest.mark.serial @pytest.mark.create_session("reusable_user") def test_user_update_url(base_url, selenium, variables): """Tests that the user’s homepage URL field is validated for correctness.""" user = User(selenium, base_url).open().wait_for_page_to_load() initial_page_url = selenium.current_url # test not a URL, this should not pass the client validation # it should not submit, red error message should not be displayed > user.edit.homepage_link_field.clear() tests/frontend/test_users.py:290: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/users.py:629: in homepage_link_field self.wait.until( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="6757fc4e-6189-42b5-b3ab-3890dc7c1013")>, method = <function visibility_of_element_located.<locals>._predicate at 0x105aba840>, message = '' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: E Stacktrace: E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8 E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5 E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5 E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException | |||
| Failed | tests/frontend/test_users.py::test_user_delete_profile_tc_id_c4393[Desktop] | 42.39 | Driver Log URL HTML |
|
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="0181e215-8cf8-4beb-981d-6f024e212611")> @pytest.mark.sanity @pytest.mark.serial @pytest.mark.create_session("reusable_user") def test_user_delete_profile_tc_id_c4393(base_url, selenium): """Verifies that a user can delete their account and be redirected to the homepage.""" user = User(selenium, base_url).open().wait_for_page_to_load() > user.edit.delete_account() tests/frontend/test_users.py:321: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pages/desktop/frontend/users.py:787: in delete_account self.wait.until( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.support.wait.WebDriverWait (session="0181e215-8cf8-4beb-981d-6f024e212611")>, method = <function element_to_be_clickable.<locals>._predicate at 0x105aba020>, message = '' def until(self, method, message: str = ""): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException` :returns: the result of the last call to `method` :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs """ screen = None stacktrace = None end_time = time.monotonic() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, 'screen', None) stacktrace = getattr(exc, 'stacktrace', None) time.sleep(self._poll) if time.monotonic() > end_time: break > raise TimeoutException(message, screen, stacktrace) E selenium.common.exceptions.TimeoutException: Message: E Stacktrace: E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8 E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5 E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5 E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16 venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException | |||
| Passed | tests/frontend/test_users.py::test_login[Desktop] | 51.45 | |
|
------------------------------Captured stdout call------------------------------ The "click continue button" event occurred. | |||
| Passed | tests/frontend/test_users.py::test_logout_tc_id_c95092[Desktop] | 60.39 | |
|
------------------------------Captured stdout call------------------------------ The "click continue button" event occurred. | |||
| Passed | tests/frontend/test_users.py::test_user_menu_collections_link_tc_id_c95102[Desktop] | 54.49 | |
|
------------------------------Captured stdout call------------------------------ The "click continue button" event occurred. | |||
| Passed | tests/frontend/test_users.py::test_user_menu_view_profile_tc_id_c95102[Desktop] | 54.54 | |
|
------------------------------Captured stdout call------------------------------ The "click continue button" event occurred. | |||
| Passed | tests/frontend/test_users.py::test_register_new_account[Desktop] | 64.79 | |
|
------------------------------Captured stdout call------------------------------ | |||
| Passed | tests/frontend/test_users.py::test_user_data_for_deleted_profile[Desktop] | 12.21 | |
|
No log output captured. | |||